package com.netflix.client.config;

import java.util.Optional;
import java.util.function.BiConsumer;

/**
 * Internal abstraction to decouple（解耦） the property source from Ribbon's internal configuration.
 * 将属性源与 Ribbon 的内部配置分离的内部抽象。
 *
 * 此接口的含义是，解耦属性的来源和ribbon的内部配置，可以这么理解：
 * 1. ribbon 内部所需要的配置信息是固定的，即需要配置哪些 key
 * 2. 但是这些 key-value 配置的地方是不固定的，它可能是一个文件，可能是操作系统的某个属性，可能是别的协议配置的
 *
 * 因此，定义这个接口来专门解析 属性源，将属性源最终转换为 ribbon 内部配置。从而达到解耦了 属性源和 ribbon内部配置
 *
 * 例如 ArchaiusPropertyResolver 类，属性源就来自 archaius 其内部的 ConfigurationManager，那么通过
 * 此类，就可以将属性解析为 ribbon 内部所需的。
 *
 * 将来如果需要从别的地方，例如 nacos ，就可以实现一个 nacosresolver 来从nacos 上解析 ribbon 所需的内部配置属性
 */
public interface PropertyResolver {
    /**
     * @return Get the value of a property or Optional.empty() if not set
     */
    <T> Optional<T> get(String key, Class<T> type);

    /**
     * Iterate through all properties with the specified prefix
     */
    void forEach(String prefix, BiConsumer<String, String> consumer);

    /**
     * Provide action to invoke when config changes
     * @param action
     */
    void onChange(Runnable action);
}
